// 路由守卫   beforeEach(to,from,next)

import store from '@/store'
import router from '@/router/index'

// to: 要去的路由
// from: 从哪个路由来
// next: 放行
router.beforeEach((to, from, next) => {
    // 给一个放行白名单
    let whiteList = ['/login']
    let hasRoutes = store.state.hasRoutes
    let menuList = store.getters.GET_MENULIST
    //有token直接放行
    let  token = store.getters.GET_TOKEN
    if(token){
      // 是否添加过动态路由，如果没有，就查询菜单列表。
      if(!hasRoutes){
        // 根据菜单详情绑定动态路由
        bindRoutes(menuList)
        store.commit('SET_HAS_ROUTES',true)
      }
      next()
    }else{
        // 没有token的情况，要看在不在白名单内
        if(whiteList.includes(to.path)){
            next()
        }else{
            next('/login')  // 既没有token又不在白名单，就跳转到登录页
        }
    }
})



// 根据菜单详情绑定动态路由
const bindRoutes= (menuList)=>{
    // 获取路由表  router.options.routes的意思是 router中options的routes属性
    let newRoutes = router.options.routes
    menuList.forEach( menu => {
        if(menu.childMenus){
          menu.childMenus.forEach( m => {
                // 菜单转路由 params: 菜单详情，父级路由名称
                let route = menuToRoute(m,menu.name)
                if(route){
                    //添加到路由管理
                    newRoutes[0].children.push(route)  //children就是子路由
                }
          })
        }
    } )

    // 上面每个路由都添加了一些子路由，但是页面上主路由可能没有更新，重新添加下
    newRoutes.forEach( route => {
       router.addRoute(route)
    })
}


// 菜单转路由: menu是菜单类， parentName是父级菜单名
const menuToRoute= ((menu,parentName) => {
    // 菜单字段为空
    if(!menu.component){
        return null
    }

    let route = {
          path: menu.path,
          name: menu.name,
          meta:{
            parentName:parentName
          }
    }
    route.component = () => import('@/views/' + menu.component + '.vue')
    return route


})